#include<bits/stdc++.h>

using namespace std;

using ll=long long;
#define endl '\n'
const int maxn = 4;
int n = 4, m = 4;
char G[maxn][maxn] = {
        'A', 'B', '/', 'D',
        'E', 'F', '/', 'H',
        'I', '/', 'K', '/',
        'M', '/', 'O', 'P',
};
int book[maxn][maxn];
int fx[4][2] = {0, 1, 0, -1, 1, 0, -1, 0};

void dfs(int x, int y) {
    book[x][y] = 1;
    for (int i = 0; i < 4; i++) {
        int nx = x + fx[i][0];
        int ny = y + fx[i][1];
        if (nx < 0 || nx >= n || ny < 0 || ny >= m || book[nx][ny] || G[nx][ny] == '/')continue;
        dfs(nx, ny);
        book[nx][ny] = 1;
    }

}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int area = 0;
    for (int i = 0; i < 4; i++)
        for (int j = 0; j < 4; j++) {
            if (book[i][j] == 1 || G[i][j] == '/')continue;
            ++area;
            dfs(i, j);
        }
    cout << area << endl;
    return 0;
}
/**
这段代码是一个计算平面图连通块数量的示例。程序定义了一个4x4的字符型数组G，表示一个平面图（矩形），其中'A'到'P'表示不同的点，'/'表示障碍物。另外定义了一个二元组fx，用来表示在搜索中每个节点的四个邻接节点（四连通规则）。

程序定义了一个DFS搜索函数dfs，其输入参数是一个坐标 (x, y) 。这个函数遍历与这个点相邻的四个节点，对于每个相邻节点，如果未被遍历过，且其对应的地图元素不是障碍物，就递归访问这个节点，并将它的book值设为1。

最后，在int main()函数中，程序先循环遍历整个地图，检查每个坐标是否已经被遍历过或是否是障碍物，如果满足这些条件，则跳过这个点，否则调用dfs函数遍历所在连通块。同时，每遍历完一个连通块，将area加1。最终输出area，即为平面图的连通块数量。

这种遍历整个图的算法称为图的深度优先遍历（DFS）。利用DFS遍历整个图，并记录遍历到的连通块的数量，是求解平面图连通块问题的一种常见方法。
 */